import axios from 'axios'
// import store from '@/store/index'
// import QS from 'qs'
import { Toast } from "vant"
import router from '../router'
// 我们的项目环境可能有开发环境、测试环境和生产环境。我们通过node的环境变量来匹配我们的默认的接口url前缀
// 环境的切换
let baseURL
if (process.env.NODE_ENV == 'development') {
    baseURL = '' // 对应换成后端给的接口地址 http://192.168.10.111:3000/
} else if (process.env.NODE_ENV == 'test') {
    // 测试
    baseURL = '/test'
} else if (process.env.NODE_ENV == 'production') {
    baseURL = ''
}

// 实例化 axios
const instance = axios.create({
    baseURL, // 设置 axios 的默认请求地址
    timeout: 5000, // 请求超时
    headers: {
        // 可定义统一的请求头部
        post: {
            // 'Content-Type': 'application/json'
            // 如果后端不支持 JSON 数据，则需要设置 application/x-www-form-urlencoded;charset=UTF-8
        }
    }
})

// 请求拦截器(在发送请求之前做些什么：统一处理 token，显示loading 等等)
let toast
instance.interceptors.request.use(
    (config) => {
        // const token = store.state.token
        toast = Toast.loading({
            message: '加载中...',
            duration: 500, // 持续展示 toast
            forbidClick: true,
        });
        // token 存在就添加到请求头里
        // 这个写法是 nodejs 的格式，必须在 Authorization 中加上 token，并且 token 前必须加上 'Bearer ' 字符串
        // java 不需要 'Bearer ' 前缀，也可能将 token 放在 Authorization 字段也可能放在 Auth 字段
        // token && (config.headers.Authorization = 'Bearer ' + token)
        // token && (config.headers.Auth = token)

        // 过滤请求参数中的 null undefined ''的函数
        // cleanObject()

        // 如果是以 application/x-www-form-urlencoded;charset=UTF-8 格式提交数据
        // 则需要将 POST 的数据序列化 QS.stringify(params)
        return config
    },
    (error) => {
        return Promise.error(error)
    }
)

// 响应拦截器(对响应数据做点什么)
instance.interceptors.response.use(
    (response) => {
        toast.clear()//清除加载效果
        // 如果返回的状态码为 200，说明接口请求成功，可以正常拿到数据
        // 否则的话抛出错误
        if (response.status == 200) {
            return Promise.resolve(response.data)
        } else {
            return Promise.reject(response)
        }
    },
    (error) => {
        toast.clear()//清除加载效果
        // 跟后台开发人员协商好统一的错误状态码
        // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等

        if (error.response.status === 401) {
            // 未登录则跳转登录页面，并携带当前页面的路径
            router.replace({
                // 回退登录页
                path: '/login',
                query: {
                    // 参数
                    redirect: router.currentRoute.fullPath // 记录你想访问的路径，那么登陆后可以实现直接跳转到该路径而不是首页
                }
            })
        } else if (error.response.status === 403) {
            // token 过期
            // Message.error('token失效，请重新登录！')
            // removeStorageToken() // 清除本地过期 token
            router.replace({
                // 回退登录页
                path: '/welcome',
                query: {
                    redirect: router.currentRoute.fullPath
                }
            })
        } else if (error.response.status === 404) {
            // 404
        } else if (error.response.status === 408) {
            // 超时
        } else if (error.response.status === 500) {
            // 500 错误
        } else {
            if (!window.navigator.onLine) {
                // Message.warning('网络异常，请检查网络是否正常连接')
            } else {
                // Message.warning('服务器异常，请联系管理员')
            }
        }
        return Promise.reject(error) // 将错误继续返回给到具体页面
    }
)

export default instance